Convert the GtkTreeIter inside the sorting functions for the search and
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 14 May 2007 10:16:07 +0000 (10:16 +0000)
committerEmmanuele Bassi <ebassi@src.gnome.org>
Mon, 14 May 2007 10:16:07 +0000 (10:16 +0000)
2007-05-14  Emmanuele Bassi  <ebassi@gnome.org>

* gtk/gtkfilechooserdefault.c:
Convert the GtkTreeIter inside the sorting functions for the
search and recent modes. This doesn't yet fix the segfault when
clicking the 'Name' column in recent mode, though.

svn path=/trunk/; revision=17843

ChangeLog
gtk/gtkfilechooserdefault.c

index bfe45b224f610dfa4914bcda0d6f45f0fb9b971d..7c2b50d821182a269c61d6f8852930f7be0514cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-05-14  Emmanuele Bassi  <ebassi@gnome.org>
+
+       * gtk/gtkfilechooserdefault.c:
+       Convert the GtkTreeIter inside the sorting functions for the
+       search and recent modes. This doesn't yet fix the segfault when
+       clicking the 'Name' column in recent mode, though.
+
 2007-05-14  Behdad Esfahbod  <behdad@gnome.org>
 
        * modules/input/gtkimcontextthai.c
index d62981e6646dcc017015385d8a19477f5201f80f..7e44643699dec6a62aedb8da04b4b907923172a5 100644 (file)
@@ -8936,14 +8936,19 @@ search_column_path_sort_func (GtkTreeModel *model,
                              GtkTreeIter  *b,
                              gpointer      user_data)
 {
+  GtkFileChooserDefault *impl = user_data;
+  GtkTreeIter child_a, child_b;
   const char *collation_key_a, *collation_key_b;
   gboolean is_folder_a, is_folder_b;
 
-  gtk_tree_model_get (model, a,
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a);
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b);
+
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_a,
                       SEARCH_MODEL_COL_IS_FOLDER, &is_folder_a,
                       SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_a,
                       -1);
-  gtk_tree_model_get (model, b,
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_b,
                       SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b,
                       SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_b,
                       -1);
@@ -8968,20 +8973,24 @@ search_column_mtime_sort_func (GtkTreeModel *model,
                               GtkTreeIter  *b,
                               gpointer      user_data)
 {
+  GtkFileChooserDefault *impl = user_data;
+  GtkTreeIter child_a, child_b;
   const struct stat *statbuf_a, *statbuf_b;
   gboolean is_folder_a, is_folder_b;
 
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a);
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b);
+
   /* Note that although we store a whole struct stat in the model, we only
    * compare the mtime here.  If we add another column relative to a struct stat
    * (e.g. a file size column), we'll want another sort callback similar to this
    * one as well.
    */
-
-  gtk_tree_model_get (model, a,
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_a,
                       SEARCH_MODEL_COL_IS_FOLDER, &is_folder_a,
                       SEARCH_MODEL_COL_STAT, &statbuf_a,
                       -1);
-  gtk_tree_model_get (model, b,
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_b,
                       SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b,
                       SEARCH_MODEL_COL_STAT, &statbuf_b,
                       -1);
@@ -9127,13 +9136,11 @@ search_setup_model (GtkFileChooserDefault *impl)
   gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort),
                                   SEARCH_MODEL_COL_PATH,
                                   search_column_path_sort_func,
-                                  impl,
-                                  NULL);
+                                  impl, NULL);
   gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort),
                                   SEARCH_MODEL_COL_STAT,
                                   search_column_mtime_sort_func,
-                                  impl,
-                                  NULL);
+                                  impl, NULL);
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->search_model_sort),
                                        SEARCH_MODEL_COL_STAT,
                                        GTK_SORT_DESCENDING);
@@ -9440,14 +9447,19 @@ recent_column_mtime_sort_func (GtkTreeModel *model,
                               GtkTreeIter  *b,
                               gpointer      user_data)
 {
+  GtkFileChooserDefault *impl = user_data;
+  GtkTreeIter child_a, child_b;
   GtkRecentInfo *info_a, *info_b;
   gboolean is_folder_a, is_folder_b;
 
-  gtk_tree_model_get (model, a,
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a);
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b);
+
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_a,
                       RECENT_MODEL_COL_IS_FOLDER, &is_folder_a,
                       RECENT_MODEL_COL_INFO, &info_a,
                       -1);
-  gtk_tree_model_get (model, b,
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_b,
                       RECENT_MODEL_COL_IS_FOLDER, &is_folder_b,
                       RECENT_MODEL_COL_INFO, &info_b,
                       -1);
@@ -9476,10 +9488,22 @@ recent_column_path_sort_func (GtkTreeModel *model,
                               GtkTreeIter  *b,
                               gpointer      user_data)
 {
+  GtkFileChooserDefault *impl = user_data;
+  GtkTreeIter child_a, child_b;
+  gboolean is_folder_a, is_folder_b;
   gchar *name_a, *name_b;
 
-  gtk_tree_model_get (model, a, RECENT_MODEL_COL_DISPLAY_NAME, &name_a, -1);
-  gtk_tree_model_get (model, b, RECENT_MODEL_COL_DISPLAY_NAME, &name_b, -1);
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a);
+  gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b);
+
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_a,
+                      RECENT_MODEL_COL_IS_FOLDER, &is_folder_a,
+                      RECENT_MODEL_COL_DISPLAY_NAME, &name_a,
+                      -1);
+  gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_b,
+                      RECENT_MODEL_COL_IS_FOLDER, &is_folder_b,
+                      RECENT_MODEL_COL_DISPLAY_NAME, &name_b,
+                      -1);
 
   if (!name_a)
     return 1;
@@ -9487,6 +9511,9 @@ recent_column_path_sort_func (GtkTreeModel *model,
   if (!name_b);
     return -1;
 
+  if (is_folder_a != is_folder_b)
+    return is_folder_a ? 1 : -1;
+
   return strcmp (name_a, name_b);
 }
 
@@ -9611,17 +9638,20 @@ recent_setup_model (GtkFileChooserDefault *impl)
    */
   impl->recent_model_sort =
     GTK_TREE_MODEL_SORT (recent_model_sort_new (impl, GTK_TREE_MODEL (impl->recent_model_filter)));
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort),
+                                  RECENT_MODEL_COL_PATH,
+                                  recent_column_path_sort_func,
+                                  impl, NULL);
   gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort),
                                    RECENT_MODEL_COL_INFO,
                                    recent_column_mtime_sort_func,
                                    impl, NULL);
-  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort),
-                                   RECENT_MODEL_COL_PATH,
-                                   recent_column_path_sort_func,
-                                   impl, NULL);
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->recent_model_sort),
                                         RECENT_MODEL_COL_INFO,
                                         GTK_SORT_DESCENDING);
+
+  gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
+                           GTK_TREE_MODEL (impl->recent_model_sort));
 }
 
 typedef struct
@@ -9638,9 +9668,6 @@ recent_idle_cleanup (gpointer data)
   RecentLoadData *load_data = data;
   GtkFileChooserDefault *impl = load_data->impl;
 
-  gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
-                           GTK_TREE_MODEL (impl->recent_model_sort));
-  
   set_busy_cursor (impl, FALSE);
   
   impl->load_recent_id = 0;